#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFile>

int MainWindow::count = 0;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //ui->record->setEnabled(false);
    ui->port->setText("8080"); // 设置默认端口号
    setWindowTitle("服务器") ;
    ui->record->setReadOnly(true);
    printHostIPAddresses();

    // 实例化监听的服务器对象
    m_s = new QTcpServer(this);

    // 等待客户链接，当有客户端链接到达时，QtcpServer对象可以发射出一个信号(newConnection)
    connect(m_s,&QTcpServer::newConnection,this,[=](){
        QTcpSocket* _tcp = new QTcpSocket;

        _tcp = m_s->nextPendingConnection(); // 通过调用此函数获取一个Socket实例对象

        int i = count;
        count++;
        cNum++;

        m_tcp.push_back(_tcp);

        //ui->C_status->setText("已连接");
        ui->C_status->setText(QString::number(cNum));


        // 文件接收:

//        QFile* file = new QFile("revc.txt");
//        // 接收数据
//        connect(_tcp, &QTcpSocket::readyRead,this,[=](){


//            // 判断to do
//            file->open(QFile::Append);

//            // 读出剩余数据
//            QByteArray all = _tcp->readAll();
//            //QString data = QString::fromUtf8(all);
//            //QByteArray all2 = all.toUtf8();

//            file->write("\n" + all);

//            file->close();

//            // 判断数据是否接收完毕
//        });


        // 实例对象什么时候可以接收数据:(检测是否可以接收数据),就是这个实例对象发射readyread信号时
        connect(_tcp,&QTcpSocket::readyRead,this,[=](){
            QByteArray data = _tcp->readAll();
            ui->record->append(data); // 追加进通信记录中
            for(int j = 0; j < m_tcp.size(); j++)
            {
                if(m_tcp[j] != nullptr && j != i)
                {
                    m_tcp[j]->write(data);
                }
            }
        });

        // 断开连接
        connect(_tcp, &QTcpSocket::disconnected,this,[=](){
            _tcp->close();
            _tcp->deleteLater();

            m_tcp[i] = nullptr;
            cNum--;

            ui->C_status->setText(QString::number(cNum));
        });



        // 不可用！！！！会切线程断连

        // 使用传参方式传递给子线程
//        RecvFile* subThread = new RecvFile(_tcp);
//        subThread->start();

//        // 因为子线程在此创建，所以子线程发送的信号也要在此处进行处理
//        connect(subThread,&RecvFile::over,this,[=](){
//            subThread->exit();
//            subThread->wait();
//            subThread->deleteLater();
//            ui->record->append( "<font color=\"#FF0000\">已成功接收xxx发送来的文件</font> ");// 将文字颜色设置为红色
//        });

    });



    // 处理状态栏
//    m_status = new QLabel(this);
//    ui->statusBar->addWidget(new QLabel("当前连接状态:"));
//    ui->statusBar->addWidget(m_status);

    ui->C_status->setText("0");
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_setListen_clicked()
{
    unsigned short port = ui->port->text().toUShort(); // 读出端口号并转换成无符号短整型
    m_s->listen(QHostAddress::Any, port); // 启动监听，绑定IP与端口
    ui->setListen->setText("已启用监听");
    ui->setListen->setEnabled(false); // 绑定后按钮设置为不可用
    // ui->record->append("已启用监听服务!");

    ui->record->append(MyHost + "已启用监听服务");
}

void MainWindow::on_sendMsg_clicked()
{
    QString msg = "服务器say: " + ui->msg->toPlainText(); // 将数据以纯文本的方式取出来
    for(int i = 0; i < m_tcp.size(); i++)
    {
        if(m_tcp[i] != nullptr)
        {
            m_tcp[i]->write(msg.toUtf8());
        }
    }
    ui->record->append(msg); // 追加进通信记录中
    ui->msg->setText("");
}

// 获取主机Ipv4地址
void MainWindow::printHostIPAddresses() {
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    foreach (QNetworkInterface interface, interfaces) {
        if (interface.flags().testFlag(QNetworkInterface::IsUp) && !interface.flags().testFlag(QNetworkInterface::IsLoopBack)) {
            QList<QNetworkAddressEntry> entries = interface.addressEntries();
            foreach (QNetworkAddressEntry entry, entries) {
                // 输出所有类型的IP地址
                //qDebug() << "IP Address:" << entry.ip().toString();

                // 如果你只想要IPv4地址，可以添加以下检查
                if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) {
                    //qDebug() << "IPv4 Address:" << entry.ip().toString();
                    MyHost = entry.ip().toString();
                }
            }
        }
    }
}


void MainWindow::on_clean_clicked()
{
    ui->record->setText("");
}
